#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2023/04/04
# @Author  : Tuut
# @Email   : 49616026@qq.com
# @File    : MyEmailConfig.py

## from smtplib import SMTP_SSL
import time
from hashlib import sha1

# 获取当前月份
batch = time.strftime("%Y-%m", time.localtime())
suffix = time.strftime("%Y%m", time.localtime())


#  邮件服务配置工厂类
#  邮件服务连接并查询
class PrintInfoConfig:
    url = ''
    user = ''
    ukey = ''
    sn = ''

    def __init__(self, url, user, ukey, sn):
        # qq邮箱smtp服务器
        self.url = url
        # sender_qq为发件人的qq号码
        self.user = user
        # 第三方客户端登录时需要的授权码，不是qq密码
        self.ukey = ukey
        # 发件人的邮箱
        self.sn = sn

    # 签名
    def signature(self, STIME):
        s1 = sha1()
        s1.update((self.user + self.ukey + STIME).encode())
        return s1.hexdigest()

    def addprinter(self, snlist):
        import requests
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_printerAddlist',  # 固定值,不需要修改
            'printerContent': snlist
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)
        else:
            print("error")

    # 小票机打印订单接口
    def printMsg(self, sn):
        import requests
        # 标签说明：
        # 单标签:
        # "<BR>"为换行,"<CUT>"为切刀指令(主动切纸,仅限切刀打印机使用才有效果)
        # "<LOGO>"为打印LOGO指令(前提是预先在机器内置LOGO图片),"<PLUGIN>"为钱箱或者外置音响指令
        # 成对标签：
        # "<CB></CB>"为居中放大一倍,"<B></B>"为放大一倍,"<C></C>"为居中,<L></L>字体变高一倍
        # <W></W>字体变宽一倍,"<QR></QR>"为二维码,"<BOLD></BOLD>"为字体加粗,"<RIGHT></RIGHT>"为右对齐
        # 条形码标签
        # <BC128_A>123ABCDEF</BC128_A>：数字字母混合条形码, 最多支持14位数字大写字母混合
        # <BC128_C>0123456789</BC128_C>：最多支持22位纯数字
        # 拼凑订单内容时可参考如下格式
        # 根据打印纸张的宽度，自行调整内容的格式，可参考下面的样例格式
        content = "<CB>测试打印</CB><BR>"
        content += "名称　　　　　 单价  数量 金额<BR>"
        content += "--------------------------------<BR>"
        content += "饭　　　　　　 1.0    1   1.0<BR>"
        content += "炒饭　　　　　 10.0   10  10.0<BR>"
        content += "蛋炒饭　　　　 10.0   10  100.0<BR>"
        content += "鸡蛋炒饭　　　 100.0  1   100.0<BR>"
        content += "番茄蛋炒饭　　 1000.0 1   100.0<BR>"
        content += "西红柿蛋炒饭　 1000.0 1   100.0<BR>"
        content += "西红柿鸡蛋炒饭 100.0  10  100.0<BR>"
        content += "备注：加辣<BR>"
        content += "--------------------------------<BR>"
        content += "合计：xx.0元<BR>"
        content += "送货地点：广州市南沙区xx路xx号<BR>"
        content += "联系电话：13888888888888<BR>"
        content += "订餐时间：2016-08-08 08:08:08<BR>"
        content += "<QR>http://www.feieyun.com</QR>"  # 把二维码字符串用标签套上即可自动生成二维码
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_printMsg',  # 固定值,不需要修改
            'sn': sn,
            'content': content,
            'times': '1'  # 打印联数
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 服务器返回的JSON字符串,建议要当做日志记录起来
        else:
            print("error")

    # 标签机打印订单接口
    def printLabelMsgWH(self, sn, _str_content):
        import requests
        # 根据打印纸张的宽度，自行调整内容的格式，可参考下面的样例格式
        content = f"<DIRECTION>1</DIRECTION>"
        content += _str_content
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_printLabelMsg',  # 固定值,不需要修改
            'sn': sn,
            'content': content,
            'times': '1'  # 打印联数
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 服务器返回的JSON字符串,建议要当做日志记录起来
        else:
            print("error")

    # 标签机打印订单接口
    def printLabelMsg(self, sn):
        import requests
        # 标签说明：
        # 以下标签里面的x，y值参数说明：
        #    x，y值需要按照实际使用的纸规格大小取值。例如标签纸大小为：宽40mm，高度为30mm。
        #    1mm=8dots
        #    x的最大值就是40*8=320，x的取值范围是0-320。
        #    y的最大值就是为30*8=240，y的取值范围是0-240。
        #
        #  <SIZE>width,height</SIZE>：
        #  该设置宽高标签只需要发送设置一次生效即可，无需放在代码每次打印设置
        #  设置卷标纸宽高，width 标签纸的宽度(不含背纸)，height 标签纸的高度(不含背纸)，单位mm，如<SIZE>30,20</SIZE>
        #
        #  <DIRECTION>n</DIRECTION> ：
        #  设定打印时出纸和打印字体的方向，n 0 或 1，每次设备重启后都会初始化为 0 值设置，1：正向出纸，0：反向出纸，
        #  如<DIRECTION>1</DIRECTION>
        #
        #  <QR x="10"  y="100"  e="L"  w="5">二维码内容</QR>：
        #  打印二维码，其中属性x为水平方向起始点坐标（默认为0），属性y为垂直方向起始点坐标（默认为0），属性e为纠错等级：
        #  L 7%M 15%Q 25%H 30%（默认为K），属性w为二维码宽度（默认为5）
        #
        #  <TEXT x="10" y="100" font="12" w="2" h="2" r="0">文本内容</TEXT>：
        #  打印文本，其中属性x为水平方向起始点坐标（默认为0），属性y为垂直方向起始点坐标（默认为0），属性font为字体：
        #  1、 8×12 dot 英数字体
        #  2、 12×20 dot 英数字体
        #  3、 16×24 dot 英数字体
        #  4、 24×32 dot 英数字体
        #  5、 32×48 dot 英数字体
        #  6、 14×19 dot 英数字体 OCR-B
        #  7、 21×27 dot 英数字体 OCR-B
        #  8、 14×25 dot 英数字体 OCR-A
        #  9、 9×17 dot 英数字体
        #  10、 12×24 dot 英数字体
        #  11、 繁体中文 24×24Font(大五码)
        #  12、 简体中文 24×24Font(GB 码)
        #  13、 韩文 24×24Font(KS 码)
        #
        #  默认为12 简体中文 24×24Font(GB 码)，属性w为文字宽度放大倍率1-10（默认为1），属性h为文字高度放大倍率1-10
        #  属性r为文字旋转角度(顺时针方向)：
        #  0     0度
        #  90   90度
        #  180 180度
        #  270 270度
        #  （默认为0）
        #
        #  <BC128 x="10" y="100" h="80" s="1" r="0" n="1" w="1">12345678</BC128>：打印code128一维码，其中属性x为水平
        #  方向起始点坐标（默认为0），属性y为垂直方向起始点坐标（默认为0），属性s是否人眼可识：0 不可识，1 可识（默认为1），
        #  属性n为窄 bar 宽度，以点(dot)表示（默认为1），属性w为宽 bar 宽度（默认为1），以点(dot)表示，属性r为文字旋转角度
        #  (顺时针方向)：
        #  0     0度
        #  90   90度
        #  180 180度
        #  270 270度
        #  （默认为0）
        _space_str = "    "
        # 根据打印纸张的宽度，自行调整内容的格式，可参考下面的样例格式
        content = "<DIRECTION>1</DIRECTION>"
        content += "<TEXT x='5' y='10' font='12' w='1' h='1' r='0'>#001       五号桌      1/3</TEXT>"
        content += "<TEXT x='5' y='80' font='12' w='1' h='1' r='0'>可乐鸡翅</TEXT>"
        content += "<TEXT x='5' y='180' font='12' w='1' h='1' r='0'>张三先生       13800138000</TEXT>"
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_printLabelMsg',  # 固定值,不需要修改
            'sn': sn,
            'content': content,
            'times': '1'  # 打印联数
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 服务器返回的JSON字符串,建议要当做日志记录起来
        else:
            print("error")

    def setPrinterWidth(self,setting,sn):
        import requests
        _space_str = "    "
        # 根据打印纸张的宽度，自行调整内容的格式，可参考下面的样例格式
        content = "<DIRECTION>1</DIRECTION>"
        content += f"<SIZE>{setting['width']},{setting['height']}</SIZE>"
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_printLabelMsg',  # 固定值,不需要修改
            'sn': sn,
            'content': content,
            'times': '1'  # 打印联数
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 服务器返回的JSON字符串,建议要当做日志记录起来
        else:
            print("error")

    def queryOrderState(self, orderid):
        import requests
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_queryOrderState',  # 固定值,不需要修改
            'orderid': orderid
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 返回的JSON字符串
        else:
            print("error")

    def queryOrderInfoByDate(self, sn, strdata):
        import requests
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_queryOrderInfoByDate',  # 固定值,不需要修改
            'sn': sn,
            'date': strdata,
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 返回的JSON字符串
        else:
            print("error")

    def queryPrinterStatus(self, sn):
        import requests
        STIME = str(int(time.time()))  # 不需要修改
        params = {
            'user': self.user,
            'sig': self.signature(STIME),
            'stime': STIME,
            'apiname': 'Open_queryPrinterStatus',  # 固定值,不需要修改
            'sn': sn,
        }
        response = requests.post(self.url, data=params, timeout=30)
        code = response.status_code  # 响应状态码
        if code == 200:
            print(response.content)  # 返回的JSON字符串
        else:
            print("error")
